@ /0

Inicio JP InicioTeste

BufIOFim  K BufIO  ; Ponteiro para fim do buffer IO
BufIO     $ =8
TMP0      K /0
TMP1      K /0
TMP2      K /0
TMP3      K /0
TMP4      K /0
SP        K /0
FP        K /0
FPTMP     K /0
; Constantes Numericas
TrintaHex K /30
CemHex    K /100
DezDec    K =10
DezMilDec K =10000
; Constantes Caracteres
CR        K /d
LF        K /a
Sinal     K /2d
Sinal_    K /2d20
; Constantes Operadores
Store     MM /0    ; Base para instrucao de store
Load      LD /0    ; Base para instrucao de load

InicioTeste SC READ_INT ; TESTE DAS SUB-ROTINAS
PD /100
HM /0

; SUB-ROTINA READ_INT
; Recebe uma sequencia numerica pela rotina READ e converte para um
; inteiro que e retornado no acumulador
READ_INT K /0
SC READ
LV /0
MM TMP1           ; TMP1 contem o resultado
LV BufIO
MM TMP2           ; TMP2 contem o ponteiro de char

LD BufIO          ; Verifica se o primeiro char e de sinal '-'
- Sinal
JZ NegativoRI
LV /0
MM TMP3           ; Inicializa flag (TMP3) indicando que nao ha sinal
JP LeCharRI
NegativoRI LV /1  ; Sobe a flag (TMP3) indicando a necessidade de correcao de sinal
MM TMP3
LV /2
+ TMP2
MM TMP2           ; Atualiza a referencia para o buffer IO

LeCharRI LD TMP1
* DezDec          ; Multiplica o resultado parcial por 10
MM TMP1
LD TMP2
+ Load
MM CarregaRI
CarregaRI LD /0   ; Carrega char no buffer IO
- TrintaHex       ; Corrige para inteiro
+ TMP1            ; Acrescenta no resultado parcial
MM TMP1
LV /2             ; Incrementa ponteiro para buffer IO
+ TMP2
MM TMP2
- BufIOFim        ; Compara com o fim do buffer IO
JN LeCharRI       ; Se for diferente volta a ler o proximo caracter

LD TMP3
JZ ResRI          ; Inverte o sinal do resultado caso TMP3
LV /0
- TMP1
MM TMP1
ResRI LD TMP1     ; Carrega o resultado para o acumulador

RS READ_INT ; FIM DA SUB-ROTINA READ_INT

; SUBROTINA READ
; Faz a leitura de caracteres digitados no teclado e preenche o buffer IO
; Retorna no acumulador o primeiro caracter lido
READ K /0       
LV BufIO
MM BufIOFim     ; Reseta referencia de fim do buffer IO
LeCharR GD /0   ; Pega dados do dispositivo
MM TMP2         ; Armazena leitura
/ CemHex
MM TMP1         ; Retira primeiro char e armazena em TMP1
- CR
JZ ENDREAD      ; Se achou CR acabou s sequencia
LD TMP1
- LF
JZ ENDREAD      ; Se acho LF acabou a sequencia

LD BufIOFim     ; Monta instrucao de preecher buffer IO
+ Store
MM GuardaR1     ; Salva instrucao de preecher buffer IO
LD TMP1
GuardaR1 MM /0  ; Armazena primeiro char (instrucao montada dinamicamente)
LV /2
+ BufIOFim
MM BufIOFim     ; Atualiza referencia

LD TMP2
* CemHex
/ CemHex
MM TMP1         ; Retira segundo char
- CR
JZ ENDREAD      ; Se achou CR acabou sequencia
LD TMP1
- LF
JZ ENDREAD      ; Se acho LF acabou a sequencia

LD BufIOFim     ; Monta instrucao de preecher buffer IO
+ Store
MM GuardaR2     ; Salva instrucao de preecher buffer IO
LD TMP1
GuardaR2 MM /0  ; Armazena segundo char
LV /2
+ BufIOFim     ; Atualiza ponteiro
MM BufIOFim

JP LeCharR

ENDREAD LD BufIO  ; Carrega o primeiro char lido no AC
RS READ ; FIM DA SUBROTINA READ

# Inicio